package com.czt.mail.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author czt
 * @version 1.0
 * {@desc}
 * @date 2024/8/23 17:35
 */
//@Component
//@Aspect
@Slf4j
public class TimeAspect {

    //*          com.czt.mail.service.*.*(..)
    //方法返回值   包路径            任意类.任意方法(任意形参)

    //切点
    @Pointcut("execution(* com.czt.mail.service.*.*(..))")
    public void pt() {

    }

    @Around("pt()")
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        //运行原始方法
        Object result = proceedingJoinPoint.proceed();

        long end = System.currentTimeMillis();

        //proceedingJoinPoint.getSignature()  获取方法名称
        log.info(proceedingJoinPoint.getSignature()+"方法执行耗时：{}ms",(end-start)/1000);
        return result;
    }

    //通知顺序 默认规则 前置通知：类名排名越靠前，越先执行；后置通知：类名排名越靠后，越后执行  和类名有关
    //通知顺序 使用@Order注解  @Order(2)  @Order(1)  数字越小越先执行
}
